package com.duoec.magichour.core.utils;

/**
 * Created by ycoe on 17/6/8.
 */
public class ArticleUtils {
    private ArticleUtils() {
    }

    public static String getHotWordSummary(StringBuilder content, String word) {
        int prevLen = 15; //向前取多少个字符
        int nextLen = 15; //向后取多少个字符
        int matchCount = 0; //命中的次数
        int maxMatchCount = 4; //最多取多少个高亮词
        int minLen = 130; //最小长度

        StringBuilder summary = new StringBuilder();

        int index = 0;
        int end = 0;
        for (; index < content.length(); index++) {
            char c = content.charAt(index);
            if (c == word.charAt(0) && matchWord(content, word, index)) {
                ++matchCount;

                getAheadChar(content, index - 1, prevLen, summary);
                summary.append("<b class=\"mark\">");
                summary.append(content.substring(index, index + word.length()));
                summary.append("</b>");

                end = getAfterChar(content, index + word.length(), nextLen, summary);
                if (matchCount >= maxMatchCount) {
                    break;
                }
            }
        }
        if (matchCount < maxMatchCount && summary.length() < minLen) {
            //未取完整，需要继续往后取
            end = getAfterChar(content, end + 1, minLen - summary.length(), summary);
        }
        if (end < content.length()) {
            summary.append("...");
        }
        return summary.toString();
    }

    public static String cleanHtml(String content) {
        return getSubText(content, content.length());
    }

    public static String getSubText(String contnet, int count) {
        StringBuilder subText = new StringBuilder();
        getAfterChar(new StringBuilder(contnet), 0, count, subText);
        return subText.toString();
    }

    private static boolean matchWord(StringBuilder content, String word, int index) {
        for (int i = 1; i < word.length(); i++) {
            if (content.length() <= index + i) {
                return false;
            }
            if (content.charAt(index + i) != word.charAt(i)) {
                return false;
            }
        }
        return true;
    }

    private static int getAfterChar(StringBuilder content, int index, int count, StringBuilder summary) {
        if (index == content.length()) {
            return index;
        }
        boolean inTag = false;
        for (int i = index; i < content.length(); i++) {
            char c = content.charAt(i);
            if (c == '<') {
                //进入标签
                inTag = true;
                continue;
            } else if (c == '>') {
                //出了标签
                inTag = false;
            } else {
                if (inTag) {
                    continue;
                }

                if (!Character.isSpaceChar(c) && c != '\n' && c != '\t') {
                    //有效字符
                    summary.append(c);
                    count--;
                    if (count == 0) {
                        //数量够了
                        return i;
                    }
                }
            }
        }
        return content.length();
    }


    private static int getAheadChar(StringBuilder content, int index, int count, StringBuilder summary) {
        if (index == 0) {
            return 0;
        }
        boolean inTag = false;
        StringBuilder ahead = new StringBuilder();
        int start = index;
        for (; start >= 0; start--) {
            char c = content.charAt(start);
            if (c == '>') {
                //进入标签
                inTag = true;
                continue;
            } else if (c == '<') {
                //出了标签
                inTag = false;
            } else {
                if (inTag) {
                    continue;
                }

                if (!Character.isSpaceChar(c) && c != '\n' && c != '\t') {
                    //有效字符
                    ahead.insert(0, c);
                    count--;
                    if (count == 0) {
                        //数量够了
                        break;
                    }
                }
            }
        }
        if (start > 0) {
            summary.append("...");
        }
        summary.append(ahead);
        return start;
    }


    public static void main(String[] args) {
        String content =
                "<div class=\"news-cont\" id=\"newContent\">\n" +
                        "                    <p>商品房限购令细则可以说是在国内市场经济仍不规范的情况下，政府出台的对楼市调控的一种政策，旨在控制百姓投资房地产。主要是限制百姓购买二套住房和投资者炒房，目的是控制日益高涨的房价。因为各地楼市的情况各有不同，因此我国很多城市都出台了地方性的商品房限购令细则。</p><p><img src=\"http://fsxf.fangdd.com/xfwf/Fo75fPFtE3zleytKXa6DMrs0A67R.jpg\"></p><p>何时取消商品房限购令</p><p>“作为一个特定时期的特殊手段，限购政策的实行短期内在调节市场、抑制投机购房方面肯定会有明显的效果。”<a href=\"http://beijing.fangdd.dev\" target=\"_blank\" title=\"北京买房\" class=\"inner-link type-city-index\">北京</a>大学房地产研究所所长陈国强说，“但这并非长久之计，如果长期实行，肯定会扭曲市场关系。”因此，在限购政策执行的同时，必须加快保障性住房的建设，增加商品房和保障性住房的供给，使限购政策在退出时，楼市能够软着陆。</p><p>无论是中央还是地方，其实都清楚地知道限购政策这种直接干预市场的调控方式只能是一种中短期政策。何时退出，主要取决于调控的目标和效果是否能够达到预期。</p><p>事实上，限制投资、投机性购房，加快保障性住房的建设，目前已经成为房地产调控的一种长期性政策指向。在这种政策指向下，限购政策的强势推出与其说是一种给楼市降温的权宜之计，更大程度上讲，其实是在为深层次的房地产调控争取时间。一方面通过限购和限贷，减少市场上的投资、投机性需求，做减法;另一方面，增加保障性住房和普通商品房的供应，做加法。只有二者同时推进，才能逐渐将市场关系捋顺。</p>\n" +
                        "                    </div>";

        long t1 = System.currentTimeMillis();
        String summary = ArticleUtils.getHotWordSummary(new StringBuilder(content), "限购令");
        System.out.println("耗时：" + (System.currentTimeMillis() - t1));
        System.out.println(summary);
    }
}
